package router

import (
	"context"
	"gateway/basic/config"
	"gateway/middleware"
	"gateway/websocket"
	"github.com/gin-gonic/gin"
	"net/http"
)

// 全局变量，避免循环依赖
var (
	hub           *websocket.Hub
	orderNotifier *websocket.OrderNotifier
)

func Load() *gin.Engine {
	r := gin.Default()
	r.Use(middleware.CORS()) // 应用CORS中间件，允许跨域请求
	r.Static("/upload", config.UploadPath)

	// 原有的路由组
	v1 := r.Group("/v1")
	{
		User(v1)         // 用户服务
		Order(v1)        // 订单服务
		StateMachine(v1) // 状态机服务
		OperationLog(v1) // 操作日志服务
		Face(v1)
		Address(v1)
		Ai(v1)
		Goods(v1)
		Withdrawal(v1)  // 提现服务
		// 财务统计相关路由
		FinanceRoutes(v1)
		// 风控规则引擎相关路由
		RiskControlRoutes(v1)
		// 资金安全相关路由
		SecurityRoutes(v1)
		QiNiuRun(r)
		UserLogin(r)
	}

	// 初始化WebSocket Hub（使用全局Hub管理器）
	globalHub := websocket.GetGlobalHub()
	hub = globalHub.GetHub()

	// 初始化订单通知器
	orderNotifier = websocket.NewOrderNotifier(hub, config.OrderClient)

	// 设置全局通知器，避免循环依赖
	websocket.SetNotifier(orderNotifier)

	// 启动订单监控
	ctx := context.Background()
	go orderNotifier.StartOrderMonitoring(ctx)

	// WebSocket路由
	r.GET("/ws", func(c *gin.Context) {
		websocket.ServeWS(hub, c.Writer, c.Request)
	})

	// 静态文件服务（用于前端页面）
	r.Static("/static", "./static")
	//r.LoadHTMLGlob("templates/*")

	// 实时听单页面
	r.GET("/", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", gin.H{
			"title": "实时听单系统",
		})
	})

	// 提现申请页面 - 支持token参数
	r.GET("/withdrawal", func(c *gin.Context) {
		// 获取token参数（如果有）
		token := c.Query("token")
		if token != "" {
			// 记录token参数用于调试
			c.Header("X-Token-Accepted", "true")
		}
		// 使用绝对路径确保文件正确加载
		c.File("d:/gowork/src/Locker/gateway/templates/withdrawal.html")
	})

	// 登录页面路由
	r.GET("/login", func(c *gin.Context) {
		c.File("./templates/login.html")
	})

	// 测试页面路由
	r.GET("/test/websocket_test.html", func(c *gin.Context) {
		c.File("./test/websocket_test.html")
	})

	return r
}

// GetHub 获取WebSocket Hub实例
func GetHub() *websocket.Hub {
	return hub
}

// GetOrderNotifier 获取订单通知器实例
func GetOrderNotifier() *websocket.OrderNotifier {
	return orderNotifier
}
